﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using Datos.InterfacesDAO;
using ConexiónBD;
using Modelo;
using Base_de_Datos.Excepciones;
using Datos.Excepciones;

namespace Datos
{
    public class DatosUsuario : IDAO_Usuario
    {

        //<summary>
        //Consulta los Datos de Usuario en la BD
        //</summary>
        public IList<Usuario> BuscarUsuario(Usuario loginUsuario)
        {
            try
            {
                ConexionBD.Conectar();
                String[,] parametro = new String[2, 2];
                parametro[0, 0] = Datos_Recursos.ApodoUsuario; parametro[1,0] = loginUsuario.ApodoUsuario;
                parametro[0, 1] = Datos_Recursos.Password; parametro[1,1] = loginUsuario.ContraseñaUsuario;

                SqlDataReader sql = ConexionBD.EjecutarStoreProcedureConParametros(Datos_Recursos.SPBuscarExistenciaUsuario, parametro, 2);

                IList<Usuario> listaUsuario = new List<Usuario>();

                if (sql.HasRows.Equals(true))
                {
                    while (sql.Read())
                    {
                        Usuario objetoUsuario = new Usuario();
                        objetoUsuario.ApodoUsuario = sql[Datos_Recursos.usuario].ToString();
                        objetoUsuario.ContraseñaUsuario = sql[Datos_Recursos.contraseña].ToString();
                        listaUsuario.Add(objetoUsuario);
                    }
                    return listaUsuario;
                }
                else
                {
                    listaUsuario = null;
                    return listaUsuario;
                }
            }
            catch (ExcepcionEjecucionBD e)
            {
                throw new ExcepcionConsultar(Datos_Recursos.Consulta, e);
            }
            finally
            {
                ConexionBD.Desconectar();
            }
        }

        //<summary>
        //Consulta la existencia del celular en la BD
        //</summary>
        public bool BuscarExistenciaCelular(Usuario usuario)
        {
            try
            {
                string telefono = usuario.CelularUsuario.Substring(1, 10);
                telefono = Datos_Recursos.CodigoVzla + telefono;

                ConexionBD.Conectar();
                String[,] parametro = new String[2, 1];
                parametro[0, 0] = Datos_Recursos.CelularUsuario; parametro[1, 0] = telefono;

                SqlDataReader sql = ConexionBD.EjecutarStoreProcedureConParametros(Datos_Recursos.SPBuscarExistenciaCelular, parametro, 1);

                // Si existe el Celular en la BD
                if (sql.HasRows.Equals(true))
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            catch (ExcepcionEjecucionBD e)
            {
                throw new ExcepcionConsultar(Datos_Recursos.Consulta, e);
            }
            finally
            {
                ConexionBD.Desconectar();
            }
        }

        //<summary>
        //Consulta la existencia del celular a actualizar en la BD
        //</summary>
        public bool BuscarExistenciaActualizacionCelular(Usuario usuario)
        {
            try
            {
                string telefono = usuario.CelularUsuario.Substring(1, 10);
                telefono = Datos_Recursos.CodigoVzla + telefono;

                ConexionBD.Conectar();
                String[,] parametro = new String[2, 2];
                parametro[0, 0] = Datos_Recursos.CelularUsuario; parametro[1, 0] = telefono;
                parametro[0, 1] = Datos_Recursos.LoginActual; parametro[1, 1] = usuario.ApodoUsuario;

                SqlDataReader sql = ConexionBD.EjecutarStoreProcedureConParametros(Datos_Recursos.SPBuscarExistenciaActualizacionCelular, parametro, 2);

                // Si existe el Celular en la BD
                if (sql.HasRows.Equals(true))
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            catch (ExcepcionEjecucionBD e)
            {
                throw new ExcepcionConsultar(Datos_Recursos.Consulta, e);
            }
            finally
            {
                ConexionBD.Desconectar();
            }
        }

        //<summary>
        //Consulta la existencia del usuario en la BD
        //</summary>
        public Usuario BuscarExistenciaUsuario(Usuario usuario)
        {
            try
            {
               ConexionBD.Conectar();
                String[,] parametro = new String[2, 2];
                parametro[0, 0] = Datos_Recursos.ApodoUsuario; parametro[1, 0] = usuario.ApodoUsuario;
                parametro[0, 1] = Datos_Recursos.Password; parametro[1, 1] = usuario.ContraseñaUsuario;

                SqlDataReader sql = ConexionBD.EjecutarStoreProcedureConParametros(Datos_Recursos.SPBuscarExistenciaUsuario, parametro, 2);

                Usuario idUsuario = new Usuario();

                // Si existe el usuario
                if (sql.HasRows.Equals(true))
                {
                    while (sql.Read())
                    {
                        idUsuario.CodigoUsuario = sql[Datos_Recursos.idUsuario].ToString();
                    }
                    return idUsuario;
                }
                else
                {
                    idUsuario.CodigoUsuario = Datos_Recursos.Cero;
                    return idUsuario;
                }
               }
            catch (ExcepcionEjecucionBD e)
            {
                throw new ExcepcionConsultar(Datos_Recursos.Consulta, e);
            }
            finally
            {
                ConexionBD.Desconectar();
            }
        }

        //<summary>
        //Consulta la existencia del usuario a actualizar en la BD
        //</summary>
        public bool BuscarExistenciaActualizacionUsuario(Usuario usuario, string usuario_actual)
        {
            try
            {
                ConexionBD.Conectar();
                String[,] parametro = new String[2, 2];
                parametro[0, 0] = Datos_Recursos.ApodoUsuario; parametro[1, 0] = usuario.ApodoUsuario;
                parametro[0, 1] = Datos_Recursos.LoginActual; parametro[1, 1] = usuario_actual;

                SqlDataReader sql = ConexionBD.EjecutarStoreProcedureConParametros(Datos_Recursos.SPBuscarExistenciaActualizacionUsuario, parametro, 2);

                // Si existe el nombre de Usuario en la BD
                if (sql.HasRows.Equals(true))
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            catch (ExcepcionEjecucionBD e)
            {
                throw new ExcepcionConsultar(Datos_Recursos.Consulta, e);
            }
            finally
            {
                ConexionBD.Desconectar();
            }
        }

        //<summary>
        //Inserta un nuevo Usuario en la BD
        //</summary>
        public bool InsertarUsuario(Usuario registro)
        {
            try
            {
                string telefono = registro.CelularUsuario.Substring(1, 10);
                telefono = Datos_Recursos.CodigoVzla + telefono;

                ConexionBD.Conectar();
                String[,] parametro = new String[2, 6];
                parametro[0, 0] = Datos_Recursos.NombreUsuario; parametro[1, 0] = registro.NombreUsuario;
                parametro[0, 1] = Datos_Recursos.ApellidoUsuario; parametro[1, 1] = registro.ApellidoUsuario;
                parametro[0, 2] = Datos_Recursos.GeneroUsuario; parametro[1, 2] = registro.GeneroUsuario;
                parametro[0, 3] = Datos_Recursos.CelularUsuario; parametro[1, 3] = telefono;
                parametro[0, 4] = Datos_Recursos.Login; parametro[1, 4] = registro.ApodoUsuario;
                parametro[0, 5] = Datos_Recursos.Password; parametro[1, 5] = registro.ContraseñaUsuario;

                SqlDataReader sql = ConexionBD.EjecutarStoreProcedureConParametros(Datos_Recursos.SPRegistrarUsuario, parametro, 6);

                return true;
            }
            catch (ExcepcionEjecucionBD e)
            {
                throw new ExcepcionRegistrar(Datos_Recursos.Registro, e);
            }
            finally
            {
                ConexionBD.Desconectar();
            }
        }

        //<summary>
        //Consulta los datos del Usuario en la BD
        //</summary>
        public Usuario BuscarDatosUsuario(string usuario)
        {
            try
            {
                ConexionBD.Conectar();
                String[,] parametro = new String[2, 1];
                parametro[0, 0] = Datos_Recursos.ApodoUsuario; parametro[1, 0] = usuario;

                SqlDataReader sql = ConexionBD.EjecutarStoreProcedureConParametros(Datos_Recursos.SPBuscarDatosUsuario, parametro, 1);

                Usuario objetoUsuario = new Usuario();

                if (sql.HasRows.Equals(true))
                {
                    while (sql.Read())
                    {
                        objetoUsuario.NombreUsuario = sql[Datos_Recursos.nombre].ToString();
                        objetoUsuario.ApellidoUsuario = sql[Datos_Recursos.apellido].ToString();
                        objetoUsuario.GeneroUsuario = sql[Datos_Recursos.genero].ToString();

                        string telefonoBD = sql[Datos_Recursos.celular].ToString();
                        string telefono = Datos_Recursos.Cero + telefonoBD.Substring(3,10);

                        objetoUsuario.CelularUsuario = telefono;
                        objetoUsuario.ApodoUsuario = sql[Datos_Recursos.usuario].ToString();
                        objetoUsuario.ContraseñaUsuario = sql[Datos_Recursos.contraseña].ToString();

                    }
                    return objetoUsuario;
                }
                else
                {
                    objetoUsuario = null;
                    return objetoUsuario;
                }
            }
            catch (ExcepcionEjecucionBD e)
            {
                throw new ExcepcionConsultar(Datos_Recursos.Consulta, e);
            }
            finally
            {
                ConexionBD.Desconectar();
            }
        }

        //<summary>
        //Actualiza Usuario en la BD
        //</summary>
        public bool ActualizarUsuario(Usuario actualizacion, string loginActual)
        {
            try
            {
                string telefono = actualizacion.CelularUsuario.Substring(1, 10);
                telefono = Datos_Recursos.CodigoVzla + telefono;

                ConexionBD.Conectar();
                String[,] parametro = new String[2, 7];
                parametro[0, 0] = Datos_Recursos.LoginActual; parametro[1, 0] = loginActual;
                parametro[0, 1] = Datos_Recursos.NombreUsuario; parametro[1, 1] = actualizacion.NombreUsuario;
                parametro[0, 2] = Datos_Recursos.ApellidoUsuario; parametro[1, 2] = actualizacion.ApellidoUsuario;
                parametro[0, 3] = Datos_Recursos.GeneroUsuario; parametro[1, 3] = actualizacion.GeneroUsuario;
                parametro[0, 4] = Datos_Recursos.CelularUsuario; parametro[1, 4] = telefono;
                parametro[0, 5] = Datos_Recursos.Login; parametro[1, 5] = actualizacion.ApodoUsuario;
                parametro[0, 6] = Datos_Recursos.Password; parametro[1, 6] = actualizacion.ContraseñaUsuario;

                SqlDataReader sql = ConexionBD.EjecutarStoreProcedureConParametros(Datos_Recursos.SPActualizarUsuario, parametro, 7);

                return true;
            }
            catch (ExcepcionEjecucionBD e)
            {
                throw new ExcepcionModificar(Datos_Recursos.Modificar, e);
            }
            finally
            {
                ConexionBD.Desconectar();
            }
        }
    }
}